package br.com.conhecimento.core.data;

import java.sql.Timestamp;
import java.text.ParseException;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.conhecimento.core.exception.CoreConhecimentoException;
import br.com.conhecimento.core.model.GestaoDemanda;
import br.com.conhecimento.core.model.GestaoDemandaPrioridade;
import br.com.conhecimento.core.model.GestaoDemandaStatus;
import br.com.conhecimento.core.model.GestaoDemandaTipo;
import br.com.conhecimento.core.model.GestaoUsuario;
import br.com.conhecimento.core.util.DateUtil;

@Repository
@Transactional
public class GestaoDemandaDaoImpl extends GenericDaoImpl<GestaoDemanda, Integer> implements GestaoDemandaDao {

	@Autowired
	private GestaoDemandaFlagDao gestaoDemandaFlagDao;

	@Autowired
	private GestaoDemandaPrioridadeDao gestaoDemandaPrioridadeDao;
	
	@Autowired
	private GestaoDemandaStatusDao gestaoDemandaStatusDao;

	@Autowired
	private GestaoDemandaClienteDao gestaoDemandaClienteDao;

	@Autowired
	private GestaoDemandaTipoDao gestaoDemandaTipoDao;
	
	@Autowired
	private GestaoUsuarioDao gestaoUsuarioDao;

	@Autowired
	@Override
	public void init(SessionFactory sessionFactory) {
		this.setSessionFactory(sessionFactory);
	}
	
	@Override
	public GestaoDemanda getDemanda(Long id) throws CoreConhecimentoException {
		Criteria crit = getSession().createCriteria(GestaoDemanda.class);
		
		if(id != null) {
			crit.add(Restrictions.eq("id", id));
		}
		
		return (GestaoDemanda) crit.uniqueResult();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GestaoDemanda> consultarDemandas(String dtConclusaoFin,
			String dtConclusaoIni, String dtSolicitacaoFin,
			String dtSolicitacaoIni, Integer idPrioridade,
			Integer idSolicitante, Integer idStatus, Integer idTipo, Integer idUsuario) {
		
		
		Criteria crit = getSession().createCriteria(GestaoDemanda.class);
		
		try {
			
			if(idUsuario == null) {
				return null;
			}
			
			GestaoUsuario usuario = gestaoUsuarioDao.getUsuario(idUsuario);
			
			crit.add(
					Restrictions.or(Restrictions.eq("publica", true), Restrictions.eq("usuario", usuario))
				);
			
			if((dtConclusaoIni != null && !dtConclusaoIni.equals("")) && (dtConclusaoFin != null && !dtConclusaoFin.equals(""))) {
				if(!DateUtil.isValidDate(dtSolicitacaoFin) || !DateUtil.isValidDate(dtConclusaoIni)) {
					return null;
				}
				
				try {
					Timestamp dataInicio = new Timestamp(DateUtil.getDate(dtConclusaoIni).getTime());
					Timestamp dataFim = new Timestamp(DateUtil.getDate(dtConclusaoFin).getTime());
					
					crit.add(Restrictions.between("dataConclusaoEfetiva", dataInicio, dataFim));
				} catch (ParseException e) {
					return null;
				}
			}
			
			if((dtSolicitacaoIni != null && !dtSolicitacaoIni.equals("")) && (dtSolicitacaoFin != null && !dtSolicitacaoFin.equals(""))) {
				if(!DateUtil.isValidDate(dtSolicitacaoFin) || !DateUtil.isValidDate(dtSolicitacaoIni)) {
					return null;
				}
				
				try {
					Timestamp dataInicio = new Timestamp(DateUtil.getDate(dtSolicitacaoIni).getTime());
					Timestamp dataFim = new Timestamp(DateUtil.getDate(dtSolicitacaoFin).getTime());
					
					crit.add(Restrictions.between("dataSolicitacao", dataInicio, dataFim));
				} catch (ParseException e) {
					return null;
				}
			}
				
			if(idPrioridade != null && idPrioridade != 0) {
				GestaoDemandaPrioridade prioridade = gestaoDemandaPrioridadeDao.getPrioridade(idPrioridade);
				crit.add(Restrictions.eq("prioridade", prioridade));
			}
			
			if(idSolicitante != null && idSolicitante != 0) {
				GestaoUsuario solicitante = gestaoUsuarioDao.getUsuario(idSolicitante);
				crit.add(Restrictions.eq("solicitante", solicitante));
			}
			
			if(idStatus != null && idStatus != 0) {
				GestaoDemandaStatus status = gestaoDemandaStatusDao.getStatus(idStatus);
				crit.add(Restrictions.eq("status", status));
			}
			
			if(idTipo != null && idTipo != 0) {
				GestaoDemandaTipo tipo = gestaoDemandaTipoDao.getTipo(idTipo);
				crit.add(Restrictions.eq("tipo", tipo));
			}
		
		} catch (CoreConhecimentoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return (List<GestaoDemanda>) crit.list();
		
	}

}
